﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Facebook.Web;

namespace OnATous.DataAccess
{
    public class Facebook
    {
        // pour les photos, j'ai trouvé https://graph.facebook.com/user_id/picture qui semble marcher mais du coup le type byte[] ne convient pas

        // Peut-être créer un constructeur qui regroupe le code en plusieurs exemplaires : token, cleint, me et friends

        /// <summary>
        /// retourne l'utilisateur courant
        /// </summary>
        /// <returns>un DBO.User contenant les infos sur l'utilisateur</returns>
        public DBO.User GetUser()
        {
            // on récupère l'utilisateur courant
            var token = FacebookWebContext.Current.AccessToken;
            var client = new FacebookWebClient(token);
            dynamic Me = client.Get("me");
            // on récupère ses données
            Dictionary<string, dynamic>.ValueCollection data = Me.Values;
            DBO.User user = new DBO.User(Int64.Parse((string)data.ElementAt(0)), (string)data.ElementAt(2), (string)data.ElementAt(3), "https://graph.facebook.com/" + Int64.Parse((string)data.ElementAt(0)) + "/picture", 5, DateTime.Now);
            return user;
        }

        /// <summary>
        /// retourne la liste des amis de l'utilisateur courant
        /// </summary>
        /// <returns>une liste de DBO.User avec les infos disponibles sur les amis</returns>
        public List<DBO.User> GetFriendList()
        {
            // on récupère la liste d'amis de l'utilisateur courant
            var token = FacebookWebContext.Current.AccessToken;
            var client = new FacebookWebClient(token);
            dynamic friends = client.Get("me/friends");

            // on en prend les données
            Dictionary<string, dynamic>.ValueCollection friendpack = friends.Values;
            var friendlist = friendpack.First();
            List<DBO.User> res = new List<DBO.User>();

            foreach (var friend in friendlist)
            {
                Dictionary<string, dynamic>.ValueCollection friendinfo = friend.Values;
                char[] sep = { ' ' };
                // le premier élément est sousla forme prénom nom, donc on fait un Split pour récupérer les deux morceaux
                // Problème géré : le cas des noms composés
                string[] Fullname = friendinfo.ElementAt(0).Split(sep);
                var id = Int64.Parse(friendinfo.ElementAt(1));
                // les champs non récupérés sont initialisés à null
                res.Add(new DBO.User(id, Fullname[0], Fullname[1], "https://graph.facebook.com/" + id + "/picture", 0, DateTime.MinValue));
            }
            return res;
        }

        /// <summary>
        /// récupère un ami identifié par son id
        /// </summary>
        /// <param name="friend_id">l'identifiant de l'ami à retourner</param>
        /// <returns>un DBO.User retournant l'ami en question</returns>
        public DBO.User GetFriend(Int64 friend_id)
        {
            var token = FacebookWebContext.Current.AccessToken;
            var client = new FacebookWebClient(token);
            dynamic friends = client.Get("me/friends");

            Dictionary<string, dynamic>.ValueCollection friendpack = friends.Values;
            var friendlist = friendpack.First();
            foreach (var friend in friendlist)
            {
                Dictionary<string, dynamic>.ValueCollection friendinfo = friend.Values;
                char[] sep = { ' ' };

                string[] Fullname = friendinfo.ElementAt(0).Split(sep);
                var id = Int64.Parse(friendinfo.ElementAt(1));
                // on teste l'identifiant
                if (id == friend_id)
                    return new DBO.User(id, Fullname[0], Fullname[1], "https://graph.facebook.com/" + id + "/picture", 0, DateTime.MinValue);
            }
            return null;
        }

        /// <summary>
        /// permet de modifier un user si les informations de son compte Facebook ont changé
        /// </summary>
        /// <param name="user">l'utilisateur à mettre à jour</param>
        /// <returns>l'utilisateur modifié</returns>
        public DBO.User ModifyUser(DBO.User user)
        {
            var token = FacebookWebContext.Current.AccessToken;
            var client = new FacebookWebClient(token);
            dynamic friends = client.Get("me/friends");
            Dictionary<string, dynamic>.ValueCollection friendpack = friends.Values;
            var friendlist = friendpack.First();
            foreach (var friend in friendlist)
            {
                Dictionary<string, dynamic>.ValueCollection friendinfo = friend.Values;
                char[] sep = { ' ' };
                string[] Fullname = friendinfo.ElementAt(0).Split(sep);
                var id = Int64.Parse(friendinfo.ElementAt(1));
                // utilisateur trouvé, on cherche si il a été modifié
                if (user.Id == id)
                {
                    user.FirstName = Fullname[0];
                    user.LastName = Fullname[1];
                    user.Pseudo = friendinfo.ElementAt(0);
                    user.Photo = "https://graph.facebook.com/" + id + "/picture";
                    // pour les autres champs on n'a rien à changer
                    break;
                }                
            }
            return user;
        }
    }
}